/***************************************************************************
*	点亮led
*	需要 #include "Pin.hpp"
*
*/

Pin led(GPIOC, LL_GPIO_PIN_13);

// 高电平点亮led
while (1) {
	LL_mDelay(500);
	led.Toggle();
}



/***************************************************************************
*	key控制led
*	需要 #include "Pin.hpp"
*
*/


Pin led(GPIOC, LL_GPIO_PIN_13), key(GPIOC, LL_GPIO_PIN_14);

key.Pull(LL_GPIO_PULL_DOWN);  // 参数选取和按键的硬件连接有关

// 高电平点亮led, 按下时被拉高.
while (1) {
	led.Value(key.Value());
	
	// 立刻可以这么写:
	// led.Value(key);
	// led = key;  // 这种写法好像会有点问题
}



/***************************************************************************
*	timer控制led
*	需要 #include "Pin.hpp"
*	需要 #include "Timer.hpp"
*	需要 导入LL的Tim驱动文件(.c)
*/


Pin led(GPIOC, LL_GPIO_PIN_13);
Timer tim1(TIM1, 840 - 1, 10000 - 1)  // 84Mhz / 840 / 10000  = 10hz

tim1.IrqnUpdate([&](Timer& t){// t和tim1等价
	led.Toggle();

}, 0);
tim1.Start();  // 除了Pin以外 所有模块都需要.Start()才能正常使用

// 高电平点亮led
while (1) ;



/***************************************************************************
*	Pwm输出
*	需要 #include "Pin.hpp"
*	需要 #include "Timer.hpp"
*	需要 #include "Pwm.hpp"
*	需要 导入LL的Tim驱动文件(.c)
*/

// 查cubemx，选用TIM2的通道2，对应引脚为PA1
Pin pwm_pin(GPIOA, LL_GPIO_PIN_1);  
Timer tim2(TIM2, 840 - 1, 1000 - 1)  // 84Mhz / 840 / 1000  = 100hz
Pwm pwm(tim2, pwm_pin, LL_TIM_CHANNEL_CH2);

// 除了Pin以外 所有模块都需要.Start()才能正常使用
tim.Start();  
pwm.Start();

pwm.Compare(250);  // 250 / 1000 = 25%占空比  平均电压为3.3 * 0.25

// 高电平点亮led
while (1) ;


/***************************************************************************
*	Usart串口
*	需要 #include "Pin.hpp"
*	需要 #include "Usart.hpp"
*	需要 导入LL的Usart驱动文件(.c)
*/


// 查cubemx，选用USART1, tx->PA9, rx->PA10
Pin tx(GPIOA, LL_GPIO_PIN_9), rx(GPIOA, LL_GPIO_PIN_10);  
Usart com(USART1, tx, rx, 115200);

// 除了Pin以外 所有模块都需要.Start()才能正常使用
com.Start();

com << "hello, world!" << endl;
com << 152 << endl;
com << 114.514f << endl;
com << 114.514 << endl;
com << "Test finished." << eof;

// 高电平点亮led
while (1) ;


/***************************************************************************
*	Usart串口, 接收中断(接收到\r\n结束时才调用)
*	需要 #include "Pin.hpp"
*	需要 #include "Usart.hpp"
*	需要 导入LL的Usart驱动文件(.c)
*/


// 查cubemx，选用USART1, tx->PA9, rx->PA10
Pin tx(GPIOA, LL_GPIO_PIN_9), rx(GPIOA, LL_GPIO_PIN_10);  
Usart com(USART1, tx, rx, 115200);

// 除了Pin以外 所有模块都需要.Start()才能正常使用
com.Start();

com.IrqnRx([&](Usart& u){  // u和com等价
	com << "Receive: " << u << " (length: " << (u16)u << ")" << endl; 
	
}, 0);

// 高电平点亮led
while (1) ;

/***************************************************************************
*	单个Adc读取，配合串口发送到电脑
*	需要 #include "Pin.hpp"
*	需要 #include "Adc.hpp"
*	需要 #include "Usart.hpp"
*	需要 导入LL的Usart驱动文件(.c)
*	需要 导入LL的Adc驱动文件(.c)
*/


// 查cubemx，选用USART1, tx->PA9, rx->PA10
// 查cubemx，选用ADC1的通道1，对应引脚为PA1
Pin tx(GPIOA, LL_GPIO_PIN_9), rx(GPIOA, LL_GPIO_PIN_10), adc_pin(GPIOA, LL_GPIO_PIN_1);  
Usart com(USART1, tx, rx, 115200);
Adc adc1(ADC1, adc_pin, LL_ADC_CHANNEL_1);

// 除了Pin以外 所有模块都需要.Start()才能正常使用
com.Start();
Adc.Start();

com.IrqnRx([&](Usart& u){  // u和com等价
	if (u[0] == 'a' && u[1] == 'd' && u[2] == 'c')
	com << "ADC1: " << adc1[1] << endl; 
	
}, 0);

// 高电平点亮led
while (1) ;

/***************************************************************************
*	多个Adc读取，配合串口发送到电脑
*	需要 #include "Pin.hpp"
*	需要 #include "Adc.hpp"
*	需要 #include "Usart.hpp"
*	需要 导入LL的Usart驱动文件(.c)
*	需要 导入LL的Adc驱动文件(.c)
*/


// 查cubemx，选用USART1, tx->PA9, rx->PA10
// 查cubemx，选用ADC1的通道1，对应引脚为PA1
Pin tx(GPIOA, LL_GPIO_PIN_9), rx(GPIOA, LL_GPIO_PIN_10), adc_pin(GPIOA, LL_GPIO_PIN_1);  
Usart com(USART1, tx, rx, 115200);
Adc adc1(ADC1, adc_pin, LL_ADC_CHANNEL_1);

// 除了Pin以外 所有模块都需要.Start()才能正常使用
com.Start();
Adc.Start();

com.IrqnRx([&](Usart& u){  // u和com等价
	if (u[0] == 'a' && u[1] == 'd' && u[2] == 'c')
	com << "ADC1: " << adc1[1] << endl; 
	
}, 0);

// 高电平点亮led
while (1) ;










